package org.telegram.telegraph.jsonutilities;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.TextNode;
import org.telegram.telegraph.api.objects.Node;
import org.telegram.telegraph.api.objects.NodeElement;
import org.telegram.telegraph.api.objects.NodeText;
import java.io.IOException;
import java.util.*;
/**
* @author Ruben Bermudez
* @version 1.0
*/
public class NodeDeserializer extends StdDeserializer<Node> {
public NodeDeserializer() {
super(Node.class);
}
@Override
public Node deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();
JsonNode node = mapper.readTree(jsonParser);
if (node instanceof TextNode) {
return new NodeText(node.asText());
} else {
JsonNode childrenNode = node.get(NodeElement.CHILDREN_FIELD);
JsonNode tagNode = node.get(NodeElement.TAG_FIELD);
JsonNode attrsNode = node.get(NodeElement.ATTRS_FIELD);
NodeElement element = new NodeElement();
element.setTag(tagNode.asText());
if (attrsNode != null && attrsNode instanceof ObjectNode) {
Map<String, String> attributes = new HashMap<>();
for (Iterator<String> it = attrsNode.fieldNames(); it.hasNext(); ) {
String field = it.next();
attributes.put(field, attrsNode.get(field).asText());
}
element.setAttrs(attributes);
}
if (childrenNode != null && childrenNode instanceof ArrayNode) {
List<Node> childNodes = new ArrayList<>();
for (Iterator<JsonNode> it = childrenNode.elements(); it.hasNext(); ) {
childNodes.add(mapper.treeToValue(it.next(), Node.class));
}
element.setChildren(childNodes);
}
return element;
}
}
}